﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.IO;
using System.Media;
using System.Data.Linq;
using Supervisor;
using System.Configuration;
using System.Data.SqlClient;

namespace CRTest //Supervisor 
{
    public partial class FormSupervisor : Form
    {
        #region Переменные
        
        SupervisorDB DB;

        long lРаботник_K;
        string sРаботник;
        long lЛистЗаявки_K;

        int iПредыдущееКоличествоЗаявокДляСборки = -1;
        SoundPlayer ЕстьЗаявка;

        // Для строки подключения
        string strDataSource;
        string strInitialCatalog;
        string strUserID;
        string strPassword;

        #endregion

        #region Конструктор
        public FormSupervisor()
        {
            InitializeComponent();

            ЕстьЗаявка = new SoundPlayer("C:\\Program Files\\Supervisor.wav");
      
        }
        #endregion


        private void FormSupervisor_Load(object sender, EventArgs e)
        {
            Bounds = Screen.PrimaryScreen.WorkingArea;
            //DB = new SupervisorDB("Data Source=F2; Initial Catalog=Farmin2008; User ID=Admin; Password=zx");
            DB = new SupervisorDB(GetConnectionString());

            ОтобразитьАктивныеЗадания();
        }

        /// <summary>
        /// Получить ConnectionStrings из app.config
        /// </summary>
        /// <returns></returns>
        private string GetConnectionString()
        {
            return ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ShowReportBuilApplication(Convert.ToInt32( textBox1.Text));
        }

        /// <summary>
        /// Показать (отправить на принтер) отчёт по зяавкам
        /// </summary>
        /// <param name="Id_K">Id заявки</param>
        public void ShowReportBuilApplication(int Id_K)
        {
            ReportDocument reportDocument = new ReportDocument();
            ParameterFields paramFields = new ParameterFields();
            // --- тестовый вариант
                reportDocument.Load(GetFilePathForApplicationReport("Заявка.rpt"));
                crystalReportViewer1.ReportSource = reportDocument;
                
            // --- тестовый вариант
            ParameterField paramField = new ParameterField();
            ParameterDiscreteValue paramDiscreteValue = new ParameterDiscreteValue();
            paramField.Name = "@Application_K";
            paramDiscreteValue.Value = Id_K; //TextBox1.Text.ToString();
            paramField.CurrentValues.Add(paramDiscreteValue);
            paramFields.Add(paramField);

            crystalReportViewer1.ParameterFieldInfo = paramFields;
            // здесь
                    // тестовый вариант
                    SetDBLogonForReport(GetConnectionParametrForReport(), reportDocument);

            //---
            reportDocument.Load(GetFilePathForApplicationReport("Заявка.rpt"));
            crystalReportViewer1.ReportSource = reportDocument;
            
            // ориганальный вариант
            /*
            ConnectionInfo cInf = GetConnectionParametrForReport();
            reportDocument.SetDatabaseLogon(cInf.UserID, cInf.Password, cInf.ServerName, cInf.DatabaseName);
            */
            crystalReportViewer1.Refresh();
            crystalReportViewer1.PrintReport();
        }

        private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument reportDocument)
        {
            TableLogOnInfo tableLogOninfo = new TableLogOnInfo();
            Tables tables = reportDocument.Database.Tables;
            foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
            {
                tableLogOninfo.ConnectionInfo = connectionInfo;
                table.ApplyLogOnInfo(tableLogOninfo);
            }
        }

        /// <summary>
        /// Показать (отправить на принтер) отчет холодовой цепи
        /// </summary>
        public void ShowReportCold()
        {
            ReportDocument reportDocument = new ReportDocument();
                // --- тест
                reportDocument.Load(GetFilePathForApplicationReport("Карта.rpt"));
                crystalReportViewerCold.ReportSource = reportDocument;

                SetDBLogonForReport(GetConnectionParametrForReport(), reportDocument);

                reportDocument.Load(GetFilePathForApplicationReport("Карта.rpt"));
                crystalReportViewerCold.ReportSource = reportDocument;
                
            /*
            ConnectionInfo cInf = GetConnectionParametrForReport();
            reportDocument.SetDatabaseLogon(cInf.UserID, cInf.Password, cInf.ServerName, cInf.DatabaseName);
            */
            crystalReportViewerCold.Refresh();
            crystalReportViewerCold.PrintReport();
        }

        private string GetFilePathForApplicationReport(string strReportName)
        {
            DirectoryInfo d;
            string directory = System.Windows.Forms.Application.StartupPath;
            d = new DirectoryInfo(directory);
            directory = d.Parent.Parent.FullName; // Parent перемещает на уровень вверх
            directory = Path.Combine(directory, "Report", strReportName); // путь для отладки

            if (System.IO.File.Exists(directory))
            {
                return directory;
            }
            else
            {
                directory = System.Windows.Forms.Application.StartupPath;
                // путь для рабочего вариант приложения. В одном каталоге с exe файлом должен находиться каталог Report с отчётом 'Заявка.rpt'
                directory = Path.Combine(directory, "Report", strReportName);

                if (System.IO.File.Exists(directory))
                {
                    return directory;
                }
            }
            return directory="";
        }


        /// <summary>
        /// Получть строку подключения для репорта
        /// </summary>
        /// <returns>стока подключения типа ConnectionInfo</returns>
        private ConnectionInfo GetConnectionParametrForReport()
        {
            SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder(GetConnectionString());
            
            ConnectionInfo con = new ConnectionInfo();

            con.ServerName = builder.DataSource;
            con.DatabaseName = builder.InitialCatalog; 
            con.UserID = builder.UserID; 
            con.Password = builder.Password; 

            return con;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            DirectoryInfo d;
            string directory = System.Windows.Forms.Application.StartupPath;
            d = new DirectoryInfo(directory);
            directory = d.Parent.Parent.FullName; // Parent перемещает на уровень вверх
            directory= Path.Combine(directory, "Report", "Заявка.rpt");
            
            //directory += "Report\\" + "Заявка.rpt";
            //directory += "\\" + ".." + "\\" + ".." + "\\" + "Report\\" + "Заявка.rpt"; // путь для отладки
         }

        private void button3_Click(object sender, EventArgs e)
        {
            //ReportDocument reportDocument = new ReportDocument();
            //reportDocument.Load(GetFilePathForApplicationReport());
            //crystalReportViewer1.ReportSource = reportDocument;
            //DataSet ds = MyQueryMethod("_Supervisor_GetApplicationList", 104846);
            //reportDocument.SetDataSource(ds);
        }

        DataSet MyQueryMethod(string sqlQueryString, int iIdk)
        {
            DataSet ds = new DataSet();
            string sqlCon = "User ID=sa;PWD=m6yws72b; server=Rom;INITIAL CATALOG=Farmin2008;";
            System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(sqlCon);

            System.Data.SqlClient.SqlDataAdapter dataAdapter = new System.Data.SqlClient.SqlDataAdapter();

            System.Data.SqlClient.SqlCommand select = new System.Data.SqlClient.SqlCommand(sqlQueryString);

            select.CommandType = CommandType.StoredProcedure;

            select.Connection = sqlConnection;

            select.Parameters.Add("@Application_K", SqlDbType.Int).Value = iIdk;

            dataAdapter.SelectCommand = select;

            dataAdapter.Fill(ds);

            return ds;
        }

        private void СтрокаВводаTextBox_TextChanged(object sender, EventArgs e)
        {
            СтрокаВводаTimer.Stop();
            СтрокаВводаTimer.Start();
        }

        private void ВремяTimer_Tick(object sender, EventArgs e)
        {
            try
            {
                int iUnallocatedId = Convert.ToInt32(ConfigurationManager.AppSettings["UnallocatedId"]);
                int? iCountUnallocated = 0;

                DateTime Время = DB._Supervisor_ПолучитьВремя().First().Время.Value;
                Text = "Supervisor [" + (Время.Hour / 10) + "" + (Время.Hour % 10) + ":" + (Время.Minute / 10) + "" + (Время.Minute % 10) + "]";

                int iКоличествоЗаявокДляСборки = DB._Supervisor_ПолучитьКоличествоЗаявокДляСборки().First().КоличествоЗаявокДляСборки.Value;
                DB._Supervisor_GetUnallocatedCountApplication(iUnallocatedId, ref iCountUnallocated);
                 
                ЗаявокLabel.Text = "Заявок: " + iКоличествоЗаявокДляСборки;
                lblNeraspApplication.Text = "Нераспределенных заявок: " + iCountUnallocated;
                if ((iПредыдущееКоличествоЗаявокДляСборки == 0) && (iКоличествоЗаявокДляСборки > 0))
                {
                    try
                    {
                        ЕстьЗаявка.Play();
                    }
                    catch (Exception) { }
                }
                iПредыдущееКоличествоЗаявокДляСборки = iКоличествоЗаявокДляСборки;
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message, "Supervisor", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Перключаемя на таб с заданиями
        /// </summary>
        private void SetTabSupervisor()
        {
            if (tabControl1.SelectedTab.Name == "tabReport")
            {
                tabControl1.SelectedIndex = 0;
                //tabControl1.TabPages["tabSupervisor"].Select();
            }
        }

        private void СтрокаВводаTimer_Tick(object sender, EventArgs e)
        {
            try
            {
                СтрокаВводаTimer.Stop();
                
                SetTabSupervisor();

                if (СтрокаВводаTextBox.Text.Trim().Length == 8) // Код работника
                {

                    _Supervisor_ПолучитьРаботникаИЕгоТекущееЗаданиеResult Line = DB._Supervisor_GetEmployeAndCurrentJob(СтрокаВводаTextBox.Text.Trim()).First();
                    if (Line.Работник_K.Value >= 0)
                    {
                        СтрокаВводаTextBox.Text = "";

                        lРаботник_K = Line.Работник_K.Value;
                        sРаботник = Line.Работник;

                        if (Line.Задание_K.Value < 0)
                        {
                            ЗаданияContextMenuStrip.Items.Clear();
                            ISingleResult<_Supervisor_ПолучитьТипыЗаданийResult> Lines2 = DB._Supervisor_ПолучитьТипыЗаданий();
                            foreach (_Supervisor_ПолучитьТипыЗаданийResult Line2 in Lines2) ЗаданияContextMenuStrip.Items.Insert(0, new ToolStripMenuItem(Line2.ТипЗадания));
                            ЗаданияContextMenuStrip.Items.Add(new ToolStripMenuItem("Прочее"));
                            foreach (ToolStripItem Item in ЗаданияContextMenuStrip.Items) Item.Click += new System.EventHandler(ЗаданияContextMenuStrip_Click);

                            ЗаданияContextMenuStrip.Show((Screen.PrimaryScreen.WorkingArea.Width - ЗаданияContextMenuStrip.Width) >> 1, (Screen.PrimaryScreen.WorkingArea.Height - ЗаданияContextMenuStrip.Height) >> 1);
                        }
                        else
                        {
                            ЗаданиеForm Задание = new ЗаданиеForm("Закончить выполнение задания", Line.Работник, Line.ТипЗадания, Line.Примечание, false);
                            if (Задание.ShowDialog() == DialogResult.OK)
                            {
                                DB._Supervisor_ОтметитьОкончаниеВыполненияЗадания(Line.Задание_K.Value);
                                ОтобразитьАктивныеЗадания();
                            }
                            Задание.Dispose();
                        }
                    }
                }
                else if (СтрокаВводаTextBox.Text.Trim().Length == 13) // Код листа заявки
                {
                    _Supervisor_ПолучитьЛистЗаявкиResult Line = DB._Supervisor_ПолучитьЛистЗаявки(СтрокаВводаTextBox.Text.Trim()).First();
                    if (Line.ЛистЗаявки_K.Value > 0)
                    {
                        lЛистЗаявки_K = Line.ЛистЗаявки_K.Value;

                        ОперацииСЗаявкойContextMenuStrip.Show((Screen.PrimaryScreen.WorkingArea.Width - ОперацииСЗаявкойContextMenuStrip.Width) >> 1, (Screen.PrimaryScreen.WorkingArea.Height - ОперацииСЗаявкойContextMenuStrip.Height) >> 1);
                    }
                }
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message, "Supervisor", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void АктивныеЗаданияTimer_Tick(object sender, EventArgs e)
        {
            ОтобразитьАктивныеЗадания();
        }

        private void ДобавитьПомощникаToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                АвторизацияForm Авторизация = new АвторизацияForm("Добавить помощника", DB);
                if (Авторизация.ShowDialog() == DialogResult.OK)
                {
                    DB._Supervisor_ДобавитьПомощникаВСборкеЗаявки(lЛистЗаявки_K, Авторизация.lРаботник_K);

                    ОтобразитьАктивныеЗадания();
                }
                Авторизация.Dispose();
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message, "Supervisor", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        private void ОтобразитьАктивныеЗадания()
        {
            try
            {
                АктивныеЗаданияTimer.Stop();
                АктивныеЗаданияTimer.Start();

                АктивныеЗаданияListView.Items.Clear();

                ISingleResult<_Supervisor_ПолучитьАктивныеЗаданияResult> Lines = DB._Supervisor_ПолучитьАктивныеЗадания();
                string[] sLine = new string[5];
                foreach (_Supervisor_ПолучитьАктивныеЗаданияResult Line in Lines)
                {
                    sLine[0] = " " + Line.Задание_K.Value;
                    sLine[1] = Line.Работник;
                    sLine[2] = Line.ТипЗадания;
                    sLine[3] = Line.Примечание;
                    DateTime Начало = Line.Начало.Value;
                    sLine[4] = (Начало.Hour / 10) + "" + (Начало.Hour % 10) + ":" + (Начало.Minute / 10) + "" + (Начало.Minute % 10);
                    if ((Начало.Day != DateTime.Now.Day) || (Начало.Month != DateTime.Now.Month) || (Начало.Year != DateTime.Now.Year)) sLine[4] = (Начало.Day / 10) + "" + (Начало.Day % 10) + "." + (Начало.Month / 10) + "" + (Начало.Month % 10) + "." + (Начало.Year / 1000) + "" + ((Начало.Year % 1000) / 100) + "" + ((Начало.Year % 100) / 10) + "" + (Начало.Year % 10) + " " + sLine[4];

                    АктивныеЗаданияListView.Items.Add(new ListViewItem(sLine));
                }
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message, "Supervisor", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }



        private void ЗаданияContextMenuStrip_Click(object sender, EventArgs e)
        {
            try
            {
                int k = 0;
                int? id_k=0;

                ЗаданиеForm Задание = new ЗаданиеForm("Начать выполнение задания", sРаботник, sender.ToString(), "", sender.ToString().Equals("Прочее"));
                if (Задание.ShowDialog() == DialogResult.OK)
                {
                    if (sender.ToString().Equals("Сборка товара") == true)
                    {
                        #region Ориганальный вариант
                        // 1
                        //  ориганальный вариант 
                        //_Supervisor_ПолучитьЗаявкуДляСборкиResult Line = DB._Supervisor_ПолучитьЗаявкуДляСборки().First(); // ориганальный вариант // за счёт First отбираем первую свободную заявку
                        #endregion
                        
                        // здесь написать метод, который проверит, есть ли заявки, которые нераспределены и вернуть её K_id
                        // и добавть задание на нераспределённую заявку

                        int UnallocatedId=Convert.ToInt32(ConfigurationManager.AppSettings["UnallocatedId"]);
                        
                        int iSheetNumBreak=Convert.ToInt32(ConfigurationManager.AppSettings["SheetNumBreak"]);
                        int iQuantityGoods = Convert.ToInt32(ConfigurationManager.AppSettings["QuantityGoods"]);

                        DB._Supervisor_GetUnallocatedApplication(UnallocatedId, ref id_k); // получаем одну из нераспределённых заявок

                        if (id_k != 0) // есть нераспределенные заявки
                        {
                            //Метод _Supervisor_ПолучитьЗаявкуДляСборки() получает нераспределённые заявки, если они есть
                            ISingleResult<_Supervisor_ПолучитьЗаявкуДляСборкиResult> ApplicationToBuildNerasp = DB._Supervisor_GetApplicationToBuild(UnallocatedId, iSheetNumBreak, iQuantityGoods);  // получаем лист заявок (если есть, то нераспределённых). 
                            foreach (_Supervisor_ПолучитьЗаявкуДляСборкиResult Line in ApplicationToBuildNerasp)
                            {
                                DB._Supervisor_AddJob(lРаботник_K, sender.ToString(), "Заявка " + Line.Контрагент + " №" + Line.Номер + " от " + Line.Дата.ToString() + " на " + ((int)Line.Сумма).ToString() + " руб.", Line.Заявка_K.Value, 1); // добавляем задание
                                ShowReportBuilApplication(Convert.ToInt32(Line.Заявка_K.Value));
                                ShowReportCold();
                            }
                        }
                        else // если нерспределённых заявок нет
                        {
                            ISingleResult<_Supervisor_ПолучитьЗаявкуДляСборкиResult> ApplicationToBuild = DB._Supervisor_GetApplicationToBuild(UnallocatedId, iSheetNumBreak, iQuantityGoods); // получаем лист заявок
                            foreach (_Supervisor_ПолучитьЗаявкуДляСборкиResult Line in ApplicationToBuild) 
                            {
                                if (k != 0)
                                {
                                    lРаботник_K = UnallocatedId; // для нераспределённых заданий lРаботник_K == 70
                                }

                                // т.е. первое задание (после разбики на 50 (сейчас 20) позиций, их скорее всего будет несколько) закрепляется за текущим работкиком, а остальные сохраняются как нераспределённые (lРаботник_K=70)
                                DB._Supervisor_AddJob(lРаботник_K, sender.ToString(), "Заявка " + Line.Контрагент + " №" + Line.Номер + " от " + Line.Дата.ToString() + " на " + ((int)Line.Сумма).ToString() + " руб.", Line.Заявка_K.Value,0); // добавляем задание

                                if (k == 0)
                                {
                                    // Отчёт с первыми 50 (сейчас 20) позициями показываем (выводим на принтер)
                                    ShowReportBuilApplication(Convert.ToInt32(Line.Заявка_K));
                                    ShowReportCold();
                                }

                                k++;
                            }
                        }

                        #region Ориганальный вариант
                        // где-то здесь написать процедуру, которая проверит кол-во заявок
                        // см. _Supervisor_ПолучитьЗаявкуДляСборки()

                        // 2
                        //var t= DB._Supervisor_ДобавитьЗадание(lРаботник_K, sender.ToString(), "Заявка " + Line.Контрагент + " №" + Line.Номер + " от " + Line.Дата.ToString() + " на " + ((int)Line.Сумма).ToString() + " руб.", Line.Заявка_K.Value); // !!!
                        //{
                        //    ConnectionInfo ConnectionInfo = new ConnectionInfo();
                        //    //ConnectionInfo.ServerName = "10.0.1.12";
                        //    ConnectionInfo.ServerName = ".";
                        //    //ConnectionInfo.DatabaseName = "Farmin2008";
                        //    ConnectionInfo.DatabaseName = "Farmin2008";
                        //    //ConnectionInfo.UserID = "Admin";
                        //    ConnectionInfo.UserID = "sa";
                        //    //ConnectionInfo.Password = "zx";
                        //    ConnectionInfo.Password = "m6yws72b";
                        //    ReportDocument ReportDocument = new ReportDocument();
                        //    //ReportDocument.Load("C:\\Program Files\\Заявка.rpt");
                        //    ReportDocument.Load("D:\\Project\\Supervisor\\Заявка.rpt");
                        //    TableLogOnInfo TableLogOnInfo;
                        //    foreach (Table Table in ReportDocument.Database.Tables)
                        //    {
                        //        TableLogOnInfo = Table.LogOnInfo;
                        //        TableLogOnInfo.ConnectionInfo = ConnectionInfo;
                        //        Table.ApplyLogOnInfo(TableLogOnInfo);
                        //    }
                        //    ЗаявкаCrystalReportViewer.ReportSource = ReportDocument;
                        //    ЗаявкаCrystalReportViewer.PrintReport();
                        //}
                        //{
                        //    ConnectionInfo ConnectionInfo = new ConnectionInfo();
                        //    //ConnectionInfo.ServerName = "10.0.1.12";
                        //    ConnectionInfo.ServerName = ".";
                        //    //ConnectionInfo.DatabaseName = "Farmin2008";
                        //    ConnectionInfo.DatabaseName = "Farmin2008";
                        //    //ConnectionInfo.UserID = "Admin";
                        //    //ConnectionInfo.Password = "zx";
                        //    ConnectionInfo.UserID = "sa";
                        //    ConnectionInfo.Password = "m6yws72b";
                        //    ReportDocument ReportDocument = new ReportDocument();
                        //    //ReportDocument.Load("C:\\Program Files\\Карта.rpt");
                        //    ReportDocument.Load("D:\\Project\\Supervisor\\Карта.rpt");
                        //    TableLogOnInfo TableLogOnInfo;
                        //    foreach (Table Table in ReportDocument.Database.Tables)
                        //    {
                        //        TableLogOnInfo = Table.LogOnInfo;
                        //        TableLogOnInfo.ConnectionInfo = ConnectionInfo;
                        //        Table.ApplyLogOnInfo(TableLogOnInfo);
                        //    }
                        //    ЗаявкаCrystalReportViewer.ReportSource = ReportDocument;
                        //    ЗаявкаCrystalReportViewer.PrintReport();
                        //}
                        #endregion 

                    }
                    else DB._Supervisor_AddJob(lРаботник_K, sender.ToString(), Задание.sПримечание, -1,0);

                    ОтобразитьАктивныеЗадания();
                }
                Задание.Dispose(); 
            }
             catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message, "Supervisor", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void АктивныеЗаданияListView_Resize(object sender, EventArgs e)
        {
            int iБазоваяШирина = (АктивныеЗаданияListView.Width - 28) / 13;
            АктивныеЗаданияListView_K.Width = 0;
            АктивныеЗаданияListView_Работник.Width = iБазоваяШирина * 3;
            АктивныеЗаданияListView_Задание.Width = iБазоваяШирина * 2;
            АктивныеЗаданияListView_Примечание.Width = iБазоваяШирина * 7;
            АктивныеЗаданияListView_Начало.Width = АктивныеЗаданияListView.Width - 28 - iБазоваяШирина * 12;
        }

        private void ПередатьДругомуРаботникуToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                АвторизацияForm Авторизация = new АвторизацияForm("Передать другому работнику", DB);
                if (Авторизация.ShowDialog() == DialogResult.OK)
                {
                    DB._Supervisor_ПередатьЗаявкуИлиЛистЗаявкиДругомуРаботнику(lЛистЗаявки_K, Авторизация.lРаботник_K);

                    ОтобразитьАктивныеЗадания();
                }
                Авторизация.Dispose();
            }
            catch (Exception Ex)
            {
                MessageBox.Show(Ex.Message, "Supervisor", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }







    }
}
